#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <errno.h>

void main()
{
	int pid;				/* 被调试进程PID */
	int wait_val;			/* 等待在这里写返回值 */
	long long counter = 1;	/* 已跟踪指令的计数值 */

	/* 将进程分为两支 */
	/* 父进程将调试子孙进程 */
	switch （pid = fork()) {
		case 0:								/* 调试子进程 */
			ptrace(PT_TRACE_ME, 0, 0, 0);

			execl("/bin/ls", "ls", 0);
			break;

		default:							/* 父进程调试子进程 */
			wait(&wait_val);	/* 等待，一直到被调试进程进入挂起状态 */

			while (WIFSTOPPED(wait_val)) { 	/* 跟踪子进程直到完成 */
				/* 执行下一条机器指令 */
				/* 切换到停止状态 */
				if (ptrace(PT_STEP, pid, (caddr_t)1, 0))
					break;

				/* 等待，直到被调试进程进入停止状态 */
				wait(&wait_val);

				/* 将已执行的机器指令计数器加1 */
				counter++;
			}
	}

	printf("==lld%d\n", counter);
}


gdb set disassembly-flavor intel
gdb set disassembly-flavor att

